//package com.sankuai.project.service;
//
//import com.sankuai.project.dao.SyslogMapper;
//import com.sankuai.project.model.Syslog;
//import com.sankuai.project.model.User;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.CompletableFuture;
//import java.util.function.BiConsumer;
//import java.util.stream.Collectors;
//
///**
// * @Author：YH
// * @Description：
// * @Date:Created in 2022/3/15 15:36
// */
//@Service
//public class CompletableFutureTests {
//
//    private static final Logger LOGGER = LoggerFactory.getLogger(CompletableFutureTests.class);
//
//    @Resource
//    private SyslogMapper syslogMapper;
//
//    public void testSomeTaskAndJoin() throws Exception {
//
//        // DynamicDataSourceContextHolder.dataSourceIds根据动态数据源数量
//        // 异步执行每个数据源查询方法
//        // 返回一个Future集合
//        List<CompletableFuture<List<User>>> futures = DynamicDataSourceContextHolder.dataSourceIds.stream()
//                .map(this::queryUsers).collect(Collectors.toList());
//
//        // 多个异步执行结果合并到该集合
//        List<User> futureUsers = new ArrayList<>();
//
//        // 通过allOf对多个异步执行结果进行处理
//        CompletableFuture allFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()]))
//                .whenComplete((v, t) -> {
//                    // 所有CompletableFuture执行完成后进行遍历
//                    futures.forEach(future -> {
//                        synchronized (this) {
//                            // 查询结果合并
//                            futureUsers.addAll(future.getNow(null));
//                        }
//                    });
//                });
//
//
//        // 阻塞等待所有CompletableFuture执行完成
//        allFuture.get();
//        // 对合并后的结果集进行去重处理
//        List<User> result = futureUsers.stream().distinct().collect(Collectors.toList());
//        LOGGER.info(result.toString());
//    }
//
//    /**
//     * 用户异步查询方法
//     *
//     * @param datasourceKey 动态数据源Key
//     * @return
//     */
//    public CompletableFuture<List<Syslog>> queryUsers(String datasourceKey) {
//
//        // 定义异步查询Future对象
//        CompletableFuture<List<Syslog>> queryFuture = CompletableFuture.supplyAsync(() -> {
//            // 切换数据源
//            //DynamicDataSourceContextHolder.setDataSourceRouterKey(datasourceKey);
//            // 执行ORM查询方法
//            return syslogMapper.selectAll();
//        });
//
//        // 异步完成执行方法
//        queryFuture.whenCompleteAsync(new BiConsumer<List<Syslog>, Throwable>() {
//            @Override
//            public void accept(List<Syslog> users, Throwable throwable) {
//                // 这里主要记录异步执行结果
//                LOGGER.info("查询记录条数:{}", users.size());
//                //LOGGER.info("数据源:{}查询完成，查询记录:{}条",datasourceKey, users.size());
//            }
//        });
//        // 返回future对象
//        return queryFuture;
//    }
//}
